package com.tedu.api.io;

import org.junit.Test;

import java.io.File;
import java.io.FileFilter;
import java.io.IOException;

/**
 * IO： 传输数据   C/S 聊天室 Version
 * API上部分：字符串、包装类、日期类、集合
 * -----电脑有三大件：CPU 硬盘 内存
 * API下部分：IO流   ----硬盘----文件数据传输
 *
 * 包位置：java.io
 * File文件、文件夹
 * 作用：用于表示操作系统中系统的一个文件或者目录“目录：文件夹”
 * 创建File对象---->有参构造器---->“路径+文件/文件夹全称”
 *
 * File类方法使用
 * 1.查看该文件或者”文件夹：目录“的属性信息（名字、大小、是否存在）
 * getName()  返回值：String
 * 作用：获取文件或者文件夹的名字【注意：不看路径是否正确】
 * length()
 * 2.操作文件或者”文件夹：目录“（创建、删除）
 * 3.访问一个”文件夹：目录“的子项
 */

public class FileAPI {
    @Test
    public void testFile(){
        //创建文件夹
        //需求：当前API下创建文件----手动----demo.txt   char r='\\'
     /*   File file=new File("D:\\javaapi\\API\\src\\main" +
                "\\java\\com\\tedu\\api\\io\\demo.txt");*/
        //相对路径---当前API下创建文件！ 项目：Maven结构 main编写代码
        //FileAPI.java 相当于  API  项目下 -->从src开始
        //操作系统：路径   \  代表路径  文件上传至服务器   √
        //               /  代表路径  文件下载本地
        //Java任何平台【操作系统】运行  统一路径属性
        //File.separator 静态属性：任何操作系统下转换成正确的路径表达方式

        File file=new File("src"+File.separator+"main" +
                ""+File.separator+"java" +
                ""+File.separator+"com" +
                ""+File.separator+"tedu" +
                ""+File.separator+"api" +
                ""+File.separator+"io"+
                ""+File.separator+"demo.txt");
        //判断文件是否存在的方法

        boolean b=file.exists();
        System.out.println("判断文件是否存在："+b);

    }
    /**
     * 查看文件或者文件夹属性信息：
     * getName()  返回值：String
     * 作用：获取文件的名字【注意：】
     * length()    返回值：long
     * 作用：返回当前文件的大小【字节量】
     * exists ()    返回值：boolean
     * 作用：判断文件是否存在
     */
    @Test
    public void testFileGL()throws IOException {
        //创建文件类---路径：Maven项目--相对路径
        //相对路径：./   当前API项目下
        File file =new File("demo"+
                ""+File. separator+"abc"+
                ""+File.separator+"bcd");
        //打印 file 路径
        System.out.println("打印file路径：file.getCanonicalPath()");
        //文件是否存在
        System.out.println("路径文件是否存在："+file.exists());
        //获取文件/文件夹的名字
        String name=file.getName();
        System.out.println("文件或文件夹的名字："+name);
        //获取文件的”大小：字节量“
        String name1=file.getName();
        System.out.println("文件或者文件夹的名字："+name);
        //获取文件的”大小：字节量“
        long len=file.length();
        System.out.println("获取文件大小【字节量】："+len);
    }
    /**
     * 使用代码完成文件或者目录自动创建
     * createNewFile()
     * 作用:创建一个新文件
     * 需求：使用代码完成 API 项目文件下 test.txt 自动创建 test.txt 文件
     */
    @Test
    public void testCreate() throws IOException {
        //创建文件类：路径+全称  ./test.txt
        File file=new File("."+
                ""+ File.separator+"test.txt");
        //判断--如果文件不存在 ----   即false  ---创建
        //    如果文件存在----不创建
        if(!file.exists()){
            System.out.println("文件不存在");//打桩 file.createNewFile();
            System.out.println("文件已经创建");
        }else{
            System.out.println("文件存在,别建了");
        }
    }
    /**
     * delete()
     * 作用：删除文件或者文件夹
     * 需求：将API项目下的    test.txt  删除
     */
    @Test
    public  void testDelete() {
        //创建File类  路径：./test.txt   ./不写代表  当前项目
        File file = new File("test.txt");
        //判断 如果文件 存在--->删除
        //               不存在-->不删除
        if (file.exists()) {
            System.out.println("文件存在");
            file.delete();
            System.out.println("文件删除~~");
        } else {
            System.out.println("文件已经删除了");
        }
    }
    /**
     * mkdir()
     * 作用：创建一个文件夹
     * 需求：在 API  项目下  创建一个文件夹  demo
     * mkdirs()
     * 作用：创建多层文件夹
     */
    @Test
    public void testMkdir(){
        //创建File文件/文件夹---》创建demo文件夹
        File file=new File("demo");
        //判断   如果文件不存在---创建文件夹
        //      存在---不创建
        if(!file.exists()) {
            System.out.println("文件夹不存在~");
            file.mkdir();
            System.out.println("创建文件夹");
        }else{
            System.out.println("别建了");
        }
    }
    /**
     * 作业1.删除多层文件夹demo/abc/bcd【不能使用递归】
     *
     * 提示：构造器 new File(File parent,"子路径")
     *      不需要exists判断
     * 思路：找到每一级路径【bcd删除完毕--abc删除完毕-demo】
     */
    /**
     * 访问文件夹----->所有子项【文件夹和文件】
     * listFiles()   返回值：File[]    文件数组
     * 作用：获取一个文件夹的子项【包含文件夹和文件】
     * isFile()   返回值：boolean
     * 作用：判断是否为文件，是文件的话输出true  ，反之  ，  false
     * isDirectory  返回值：boolean
     * 作用：判断是否为文件夹，是文件夹的话，返回true，不是的话，反之
     * 需求：获取 API 项目下所有的文件夹的文字
     */
    @Test
    public void testListFiles() {
        //获取  API  项目
        File file = new File("." + File.separator);
        // System.out.println(file.getCanonicalFile());
        //过滤：3个文件 还有4个文件夹，过滤是文件夹的
        if (file.isDirectory()) {//----过滤没有效果-----
            //获取到所有的文件夹
            File[] dir = file.listFiles();
            //遍历所有的文件夹名字
            for (int i = 0; i < dir.length; i++) {//i
                //i 拿到所有的下标  //打印文件夹名字
                System.out.println(dir[i].getName());
            }
        }
    }
    // 作业1.删除多层文件夹demo/abc/bcd【不能使用递归】
    @Test
    public void testHomeWork1() {
        //1.创建多层文件夹 demo/abc/bcd
        File parent =new File ("demo");
        //构造器使用（父级路径，子机路径）：父级路径/子级路径
        File child1=new File(parent,"abc");
        File child2=new File(child1,"bcd");


        child2.delete();//删除bcd
        child1.delete();//删除abc
        parent.delete();//删除demo
        //作葉2.提示--創建FileFilter接口--匿名内部類
        /**
         * FileFilter ff=new FileFilter(){
         *     public boolean accept(File pathname){
         *     return false;
         * }
         */
        parent.listFiles(new FileFilter() {
            @Override
            public boolean accept(File pathname) {
                return false;
            }
        });
    }

}



